<?php

namespace app\common\model;
use think\Model;
use think\Db;

class OcationClass extends Model
{
    // 表名
    public $name = 'ocation_class';
    public $prefix_new = 'fa_';
    // 自动写入时间戳字段
    protected $autoWriteTimestamp = 'datetime';

    // 定义时间戳字段名
    protected $createTime = 'create_time';
    protected $updateTime = 'update_time';
    public $data;

    /**
     * 关联教学点
     */
    public function ocation()
    {
        return $this->belongsTo('Ocation', 'ocation_id', 'id');
    }


    public function createOcationClass($ocationId){
        // 获取教学点信息
        $ocation = model("Ocation")->where("id", $ocationId)->find();
        if (!$ocation) {
            throw new \Exception("教学点ID {$ocationId} 不存在");
        }

        $ocationName = $ocation['name'] ?? '未知教学点';
        $courseCount = $this->getCourseCountAttr([], ['id' => $ocationId]);

        $ocationClass = [
            'ocation_id' => $ocationId,
            'name' => $ocationName . '班',
            'original_name' => $ocationName,
            'sequence_number' => self::getNextSequence(),
            'status' => 1,
            'weigh' => 0,
            'community_id' => $ocation['community_id'] ?? null,
            'cover' => $ocation['cover'] ?? null,
            'create_time' => date('Y-m-d H:i:s'),
            'update_time' => date('Y-m-d H:i:s'),
            'description' => '自动创建的教学点班级,包含'.$courseCount.'门课程'
        ];
        return $this->save($ocationClass);
    }

    /**
     * 关联课程
     */
    public function courses()
    {
        return $this->belongsToMany('Classes', 'fa_ocation_class_course', 'ocation_class_id', 'class_id');
    }

    /**
     * 获取下一个序号
     * @return int
     */
    public static function getNextSequence()
    {
        $maxSequence = self::max('sequence_number');
        return $maxSequence ? $maxSequence + 1 : 1;
    }

    /**
     * 获取格式化的序号（带前缀）
     * @param int $sequenceNumber 序号
     * @return string
     */
    public static function getFormattedSequence($sequenceNumber)
    {
        return 'O-' . str_pad($sequenceNumber, 7, '0', STR_PAD_LEFT);
    }

    /**
     * 获取格式化序号
     */
    public function getFormattedSequenceAttr($value, $data)
    {
        return self::getFormattedSequence($data['sequence_number']);
    }



    /**
     * 获取课程数量
     */
    public function getCourseCountAttr($value, $data)
    {
        return Db::name('ocation_class_course')
            ->where('ocation_class_id', $data['id'])
            ->where('status', 1)
            ->count();
    }

    /**
     * 批量更新教学点课程记录
     * @param array $data 要更新的数据数组，每个元素必须包含id字段
     * @return bool
     */
    public static function batchUpdate($data)
    {
        if (empty($data)) {
            return true;
        }
        
        try {
            foreach ($data as $item) {
                if (!isset($item['id'])) {
                    continue;
                }
                
                $id = $item['id'];
                $updateData = $item;
                unset($updateData['id']); // 移除ID字段，避免更新主键
                
                // 添加更新时间
                $updateData['update_time'] = date('Y-m-d H:i:s');
                
                // 更新记录
                Db::name('ocation_class')->where('id', $id)->update($updateData);
            }
            
            return true;
        } catch (\Exception $e) {
            // 记录错误日志
            \think\Log::error('批量更新教学点课程记录失败：' . $e->getMessage());
            return false;
        }
    }
    
    /**
     * 批量插入教学点课程记录
     * @param array $data 要插入的数据数组
     * @return array|bool 成功返回插入的ID数组，失败返回false
     */
    public static function batchInsert($data)
    {
        if (empty($data)) {
            return [];
        }
        
        try {
            $insertIds = [];
            
            foreach ($data as $item) {
                // 添加创建和更新时间
                $item['create_time'] = date('Y-m-d H:i:s');
                $item['update_time'] = date('Y-m-d H:i:s');
                
                // 插入记录
                $id = Db::name('ocation_class')->insertGetId($item);
                if ($id) {
                    $insertIds[] = $id;
                }
            }
            
            return $insertIds;
        } catch (\Exception $e) {
            // 记录错误日志
            \think\Log::error('批量插入教学点课程记录失败：' . $e->getMessage());
            return false;
        }
    }
    
    /**
     * 初始化教学点班级
     * 根据现有的社区班级数据创建教学点班级
     * @return bool
     */
    public static function initializeFromCommunityClasses()
    {
        // 清空教学点班级表和关联表
        Db::execute("TRUNCATE TABLE `fa_ocation_class`");
        Db::execute("TRUNCATE TABLE `fa_ocation_class_course`");
        
        // 获取所有二级教学点
        $ocations = Db::name('ocation')
            ->where('address_lv_octionlevel', 2) // 二级教学点
            ->where('status', 1)
            ->select();
        
        $sequence = 1;
        foreach ($ocations as $ocation) {
            // 查找使用该教学点的社区班级
            $classes = Db::name('eb_classes')
                ->where('classes_type', 2) // 社区班级
                ->where('ocation_id', $ocation['id'])
                ->where('status', 1)
                ->select();
            
            if (!empty($classes)) {
                // 创建教学点班级
                $ocationClass = [
                    'ocation_id' => $ocation['id'],
                    'name' => $ocation['name'] . '班',
                    'original_name' => $ocation['name'],
                    'sequence_number' => $sequence,
                    'status' => 1,
                    'weigh' => 0,
                    'create_time' => date('Y-m-d H:i:s'),
                    'update_time' => date('Y-m-d H:i:s'),
                    'community_id' => $classes[0]['community_id'], // 使用第一个班级的社区ID
                    'cover' => $classes[0]['cover'], // 使用第一个班级的封面
                    'description' => '教学点：' . $ocation['name'] . '，包含' . count($classes) . '个课程'
                ];
                
                $ocationClassId = Db::name('ocation_class')->insertGetId($ocationClass);
                
                // 创建关联记录
                foreach ($classes as $class) {
                    $relation = [
                        'ocation_class_id' => $ocationClassId,
                        'class_id' => $class['id'],
                        'status' => 1,
                        'create_time' => date('Y-m-d H:i:s'),
                        'update_time' => date('Y-m-d H:i:s')
                    ];
                    
                    Db::name('ocation_class_course')->insert($relation);
                }
                
                $sequence++;
            }
        }
        
        return true;
    }

    /**
     * 根据教学点ID更新或创建教学点课程记录
     * @param array $data 更新数据
     * @param int $ocationId 教学点ID
     * @return bool 是否成功
     */
    public function updateByOcationId($data, $ocationId)
    {
        try {
            Db::startTrans();

            // 查询现有记录
            $existingRecord = $this->where('ocation_id', $ocationId)->find();

            if ($existingRecord) {
                // 更新现有记录
                $data['update_time'] = date('Y-m-d H:i:s');
                $result = $this->where('ocation_id', $ocationId)->update($data);
            } else {
                // 创建新记录
                $data['ocation_id'] = $ocationId;
                $data['sequence_number'] = self::getNextSequence();
                $data['create_time'] = date('Y-m-d H:i:s');
                $data['update_time'] = date('Y-m-d H:i:s');
                $result = $this->save($data);
            }

            Db::commit();
            return $result !== false;

        } catch (\Exception $e) {
            Db::rollback();
            file_put_contents($_SERVER["DOCUMENT_ROOT"]."/../runtime/log/ocation_class_update_error.log",
                date('Y-m-d H:i:s') . " - " . $e->getMessage() . "\n", FILE_APPEND);
            return false;
        }
    }
    
    /**
     * 获取班级类型文本
     */
    public function getClassTypeTextAttr($value, $data)
    {
        $types = [
            1 => '普通班级',
            2 => '兴趣班级',
            3 => '专业班级',
            4 => '活动班级'
        ];
        return isset($types[$data['class_type']]) ? $types[$data['class_type']] : '未知类型';
    }
    
    /**
     * 获取管理员名称
     */
    public function getAdminNameAttr($value, $data)
    {
        if (empty($data['manager_id'])) {
            return '';
        }
        
        $admin = Db::name('admin')->where('id', $data['manager_id'])->field('nickname')->find();
        return $admin ? $admin['nickname'] : '';
    }
    
    /**
     * 获取教学点名称
     */
    public function getOcationNameAttr($value, $data)
    {
        if (empty($data['ocation_id'])) {
            return '';
        }
        
        $ocation = Db::name('ocation')->where('id', $data['ocation_id'])->field('name')->find();
        return $ocation ? $ocation['name'] : '';
    }
    
    /**
     * 获取状态文本
     */
    public function getStatusTextAttr($value, $data)
    {
        $status = $data['status'] ?? 0;
        return $status == 1 ? '正常' : '禁用';
    }
    
    /**
     * 关联管理员
     */
    public function admin()
    {
        return $this->belongsTo('Admin', 'manager_id', 'id');
    }
    
    /**
     * 获取班级列表（根据用户权限过滤）
     */
    public static function getClassListByUser($user = null)
    {
        if (is_null($user)) {
            $user = $_SESSION['think']['admin'] ?? [];
        }
        
        $where = [];
        
        // 根据用户组过滤数据
        if (isset($user['group_id'])) {
            if ($user['group_id'] == 8 && isset($user['city_id']) && !empty($user['city_id'])) {
                // 社区管理员只能看到自己城市的班级
                $where['city_id'] = $user['city_id'];
            } elseif ($user['group_id'] == 3 && isset($user['school_id']) && !empty($user['school_id'])) {
                // 学校管理员只能看到自己学校的班级
                $where['school_id'] = $user['school_id'];
            }
        }
        
        return self::where($where)->select();
    }
}